package service

import (
	"errors"
	"sdc/repository/db/model"
	"sdc/utils"

	"gorm.io/gorm"
)

type UserService struct {
	db *gorm.DB
}

func NewUserService(db *gorm.DB) *UserService {
	return &UserService{db: db}
}

//user.go文件解决什么？需要返回什么？
//答：这个文件解决用户注册和登录的问题，需要返回token，有错误返回错误，上层api层根据返回处理响应码

// Register 注册用户
func (s *UserService) Register(user *model.User, password string) error {
	// 用户名和密码校验
	if user.Username == "" || password == "" {
		return errors.New("用户名和密码不能为空")
	}

	// 密码加密
	// user.Password = utils.HashPassword(password)

	// 插入数据库
	return s.db.Create(user).Error

}

// Login 登录
func (s *UserService) Login(username, password string) (string, error) {
	// 查询用户
	user := &model.User{}
	if err := s.db.Where("username = ?", username).First(user).Error; err != nil {
		return "", err
	}

	// 密码校验,这里后面做Bcrypt加密
	if user.Password != password {
		return "", errors.New("密码错误")
	}

	// 生成Token
	token, err := utils.GenerateToken(uint(user.ID))
	if err != nil {
		return "", err
	}

	return token, nil
}

// GetUserByID 获取用户信息
func (s *UserService) GetUserByID(userID uint64) (*model.User, error) {
	user := &model.User{}
	if err := s.db.Where("id = ?", userID).First(user).Error; err != nil {
		return nil, err
	}
	return user, nil
}

// ListUsers 获取用户列表
func (s *UserService) ListUsers(keyword string, page, pageSize int) (users []model.User, total int64, err error) {
	offset := (page - 1) * pageSize
	query := s.db.Model(&model.User{})

	if keyword != "" {
		query = query.Where(
			"username LIKE ? OR phone LIKE ? OR email LIKE ?",
			"%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%",
		)
	}

	// 统计总数
	err = query.Count(&total).Error
	if err != nil {
		return nil, 0, err
	}

	// 查询用户列表，排除敏感字段
	err = query.Select("id, username, avatar, phone, email, status, created_at, updated_at").
		Offset(offset).Limit(pageSize).
		Order("created_at DESC").
		Find(&users).Error

	return users, total, err
}

// UpdateUser 更新用户信息
func (s *UserService) UpdateUser(user *model.User) error {
	return s.db.Save(user).Error
}
